import { defineStore } from 'pinia';
import { getToken, removeToken, setToken } from '../utils/token-utils';

//如式引入类型需要使用import type
import  type { reqUserInfoReturnType } from '@/api/userlnfo';
import type { RouteRecordRaw } from 'vue-router';

//引入路由的列表数据
import { staticRoutes } from '@/router/routes';

//引入api的请求
import { requestLogin ,requestUserInfo,requestLogout} from '@/api/userlnfo';
//引入api发送数据的类型
import type { reqLoginParamType } from '@/api/userlnfo';


//定义state的数据类型
export interface  UserInfoState {
  token:string,
  userInfo:reqUserInfoReturnType,
  menuRoutes:RouteRecordRaw[]
}
/**
 * 用户信息
 * @methods setUserInfos 设置用户信息
 */
export const useUserInfoStore = defineStore('userInfo', {
  //声明state的数据并且使用好类型声明
	state: (): UserInfoState => ({
    token: (getToken() as string) ||"",
    userInfo:{
      routes:[],
      buttons: [],
      roles: [],
      name: "",
      avatar: ""
    },
    //是由路由组成的数组，后续式侧边栏的引用使用
    menuRoutes: staticRoutes
  }),

	actions: {
    //登录的回调函数
    async login(loginParam: reqLoginParamType) {
      try {
        //发送登录请求/拿到token
        const result = await requestLogin(loginParam)
        //将token放到state中
        this.token = result.token
        //然后实现数据持久化，因为pinia无法刷新后继续存在值
        setToken(result.token)
      } catch (error) {
        //如果请求失败，可以传一个失败的promise
        return Promise.reject(error)
      }
    },
    //请求用户信息的回调函数
    async getInfo() {
      try {
        //发送请求用户请求
        const result = await requestUserInfo()
        //将数据放到state中
        this.userInfo = result
      } catch (error) {
        return Promise.reject(error)
      }
    },
    //退出登录的回调函数
    async getLogout() {
      try {
        //发送退出登录请求
        await requestLogout()
        //然后调用reset方法 删除token
        this.reset()
      } catch (error) {
        return Promise.reject(error)
      }
    },
    reset() {
      // 删除local中保存的token
      removeToken()
      // 然后将数据清零
      //清除store的token
      this.token =""
      this.userInfo = {
        routes: [],
        buttons: [],
        roles: [],
        name: "",
        avatar: ""
      }
    },
	},
});
